

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-04-21
 * Time: 17:38
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class Main {
    public static void main(String[] args) {
        // 1. 创建ArrayList并初始化数据
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);    // 添加元素1
        list.add(2);    // 添加元素2
        list.add(3);    // 添加元素3
        list.add(4);    // 添加元素4

        // 直接打印ArrayList对象（底层调用toString()方法）
        System.out.println("ArrayList内容: " + list);// ArrayList内容: [1, 2, 3, 4]

        // 2. 基本遍历方式
        System.out.println("=======for循环========");
        // 通过索引( 下标 )遍历（适合需要操作索引的场景）
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");// 1 2 3 4
        }
        System.out.println(); // 换行

        System.out.println("=======for-each循环========");
        // 底层通过Iterator实现（代码更简洁）
        // 注意：不能在遍历中直接删除/添加元素，否则会抛出ConcurrentModificationException
        for (Integer x : list) {
            System.out.print(x + " ");// 1 2 3 4
        }
        System.out.println();

        // 3. 迭代器遍历
        System.out.println("=======迭代器遍历1（正向）========");
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            // 使用next()获取元素并移动指针
            System.out.print(it.next() + " ");// 1 2 3 4
            // 此处可安全调用it.remove()删除当前元素
        }
        System.out.println();

        System.out.println("=======迭代器安全删除示例========");
        // 创建原列表的副本，避免修改原始数据影响后续示例
        ArrayList<Integer> copyList1 = new ArrayList<>(list);
        Iterator<Integer> removeIt = copyList1.iterator();
        while (removeIt.hasNext()) {
            Integer num = removeIt.next();
            if (num % 2 == 0) {        // 删除偶数元素
                // 迭代器的remove()会删除最近一次next()返回的元素
                removeIt.remove();      // 安全删除当前元素
                System.out.println("已删除元素: " + num);
            }
            /*输出：
            已删除元素: 2
            已删除元素: 4*/
        }
        System.out.println("删除偶数后的副本列表: " + copyList1);// [1, 3]
        System.out.println("原始列表仍保持完整: " + list); // [1, 2, 3, 4]


        System.out.println("=======迭代器遍历2（ListIterator正向）========");
        ListIterator<Integer> lit = list.listIterator();
        while (lit.hasNext()) {
            // ListIterator支持双向遍历和修改操作
            System.out.print(lit.next() + " ");// 1 2 3 4
            // lit.set(100);   // 修改当前元素
            // lit.add(999);   // 添加元素（需谨慎使用，会改变列表结构）
        }
        System.out.println();

        System.out.println("=======迭代器遍历3（ListIterator反向）========");
        // 从末尾开始遍历（参数list.size()表示初始指针位置）
        ListIterator<Integer> litPrev = list.listIterator(list.size());
        while (litPrev.hasPrevious()) {
            // previous()从后向前遍历
            System.out.print(litPrev.previous() + " ");// 4 3 2 1
        }
        System.out.println();


        System.out.println("=======ListIterator修改元素示例========");
        ArrayList<Integer> copyList2 = new ArrayList<>(list);
        ListIterator<Integer> modifyIt = copyList2.listIterator();
        while (modifyIt.hasNext()) {
            Integer num = modifyIt.next();
            if (num == 3) {
                // set()修改最近一次next()/previous()返回的元素
                modifyIt.set(num * 100); // 将3修改为300
                System.out.println("修改元素: 3 -> 300");
            }
        }
        System.out.println("修改后的副本列表: " + copyList2);// [1, 2, 300, 4]
        System.out.println("原始列表仍保持完整: " + list);// [1, 2, 3, 4]


        System.out.println("=======ListIterator添加元素示例========");
        ArrayList<Integer> copyList3 = new ArrayList<>(list);
        ListIterator<Integer> addIt = copyList3.listIterator();
        while (addIt.hasNext()) {
            Integer num = addIt.next();
            if (num == 2) {
                // add()在最近一次next()返回的元素后插入（不影响后续遍历）
                addIt.add(999);         // 在2后面插入999
                System.out.println("在元素2后添加新元素999");
            }
        }
        System.out.println("添加元素后的副本列表: " + copyList3);// [1, 2, 999, 3, 4]
        System.out.println("原始列表仍保持完整: " + list);// [1, 2, 3, 4]
    }
}
